home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
071-080
/
amok71
/
imagemaker
/
imagemaker.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-04
|
4KB
|
191 lines
/*
*
* ImageMaker for OBERON written jul-91 by Matthias Scherrer
*
* usage: ImageMaker brushname
*
* brushname: a brush-file (DPaint)
*
*
*/
#include <stdio.h>
#include <exec/types.h>
#include <exec/memory.h>
extern void *AllocMem();
struct BMHD
{
UWORD Width,Height;
WORD LeftEdge,TopEdge;
UBYTE Depth;
UBYTE Mask;
UBYTE Compression;
UBYTE pad1;
UWORD transparentColor;
UBYTE xAspect,yAspect;
WORD pageWidth,pageHeight;
} BMHeader;
struct Image
{
SHORT LeftEdge,TopEdge;
SHORT Width,Height,Depth;
SHORT *ImageData;
UBYTE PlanePick,PlaneOnOff;
struct Image *NextImage;
} Brush;
BYTE imagename[40],imagefile[40];
UBYTE *imagedata=0;
UWORD *data;
WORD sp;
LONG i,j;
ULONG mem;
FILE *fp;
main (argc,argv)
SHORT argc;
BYTE *argv[];
{
SHORT x,y,z;
if(argc<2 || argc>2 || *argv[1]=='?')
exit(
puts("Usage: ImageMaker <brushname>"));
if(!strcmp(argv[1],"-s")) argv[1]=argv[2];
for(i=strlen(argv[1])-1;i>=0;i--)
if(*(argv[1]+i)==':' || *(argv[1]+i)=='/') break;
sprintf(imagename,"%s",argv[1]+i+1);
printf("Loading Brush %s...",argv[1]);
LoadBrush(argv[1]);
Brush.ImageData=(SHORT *)imagedata;
Brush.Width=BMHeader.Width;
Brush.Height=BMHeader.Height;
Brush.Depth=BMHeader.Depth;
Brush.PlanePick=(1<<BMHeader.Depth)-1;
data=(UWORD *)imagedata;
x=Brush.Width/16+(Brush.Width%16>0);
y=Brush.Height;
z=Brush.Depth;
printf("\n\nConverting to file %s.mod\n\n",&imagename[0]);
sprintf(imagefile,"%s.mod",argv[1]);
if(!(fp=fopen(imagefile,"w")))
exit(printf("Can't open file '%s' for write.\n",argv[2]));
fprintf(fp,"MODULE XYZ;\n");
fprintf(fp,"\nIMPORT s:SYSTEM, i:Intuition;\n");
fprintf(fp,"\n(* $DataChip+ *)\n");
fprintf(fp,"\n(* Image: %d*%d*%d (Width,Height,Depth) *)\n",
Brush.Width,Brush.Height,Brush.Depth);
fprintf(fp,"\nTYPE %sArr = ARRAY %d OF INTEGER;\n",imagename,
((Brush.Width+15)/16)*Brush.Height*Brush.Depth);
fprintf(fp,"\n");
fprintf(fp,"\nCONST %s = %sArr(\n",imagename,imagename);
for(j=0;j<z;j++)
{
for(i=0;i<x*y;i++)
{
fprintf(fp,"\n");
sp=data[i+j*x*y];
fprintf(fp," %7d,",sp);
sp=data[++i+j*x*y];
fprintf(fp," %7d",sp);
if(i+1<x*y) fprintf(fp,",");
}
if (j+1<z) fprintf(fp,",\n");
}
fprintf(fp,");\n\n");
fprintf(fp,"VAR %sAdr* : i.ImagePtr;\n",imagename);
fprintf(fp,"\nBEGIN\n");
fprintf(fp," %sAdr:=s.ADR(%s);\n",imagename,imagename);
fprintf(fp,"END XYZ.\n\n");
fclose(fp);
FreeMem(imagedata,mem);
}
LoadBrush(name)
char *name;
{
BYTE c2;
UBYTE *ptr;
SHORT c,ct,ct2;
UWORD BWidth,BHeight,BDepth;
if(!(fp=fopen(name,"r")))
exit(printf("Can't read '%s'.\n",name));
if(!SearchHeader(fp,"ILBMBMHD"))
exit(fclose(fp),printf("Not an IFF-File.\n"));
ptr=(UBYTE *)&BMHeader;
for(i=0;i<20;i++) *(ptr++)=getc(fp);
BWidth=((BMHeader.Width+15)/16)*2;
if(!(imagedata=AllocMem(mem=(ULONG)
(BWidth*BMHeader.Height*BMHeader.Depth),MEMF_CHIP)))
exit(fclose(fp),printf("Not enough CHIP-RAM!\n"));
if(!SearchHeader(fp,"BODY"))
exit(fclose(fp),
FreeMem(imagedata,mem),
printf("Not an IFF-File.\n"));
for(BHeight=0;BHeight<BMHeader.Height;BHeight++)
{
for(BDepth=0;BDepth<BMHeader.Depth;BDepth++)
{
ptr=imagedata+BDepth*BWidth*BMHeader.Height+BHeight*BWidth;
ct2=0;
if(!BMHeader.Compression)
while(ct2++<BWidth) *ptr++=getc(fp);
else
{
while(ct2<BWidth)
{
c=getc(fp);
if(c<=128)
{
ct=c+1;
for(i=0;i<ct;i++){ *ptr++=getc(fp); ct2++; }
}
else
{
ct=256-c+1;
c2=getc(fp);
for(i=0;i<ct;i++){ *ptr++=c2; ct2++; }
}
}
}
}
}
fclose(fp);
}
SearchHeader(fp,iffheader)
FILE *fp;
UBYTE *iffheader;
{
SHORT c;
UBYTE *cp=iffheader;
while((c=getc(fp))!=EOF)
{
if(c==*cp){cp++;if(!*cp) break; }
else cp=iffheader;
}
if (c==EOF) return(0);
else { for(i=0;i<4;i++) getc(fp); return(1); }
}